pacman::p_load(arrow, lubridate, maptools, sp, sf, raster, spatstat, tmap, classInt, viridis, tidyverse, spNetwork)Geospatial Analysis using OneMap Data
Data Analysis
Reading shapefiles that were exported from our qgis geopackage:
pg_wdl <- st_read(dsn = "data/geospatial",
layer = "pg_wdl")Reading layer `pg_wdl' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 3938 features and 12 fields
Geometry type: LINESTRING
Dimension: XY
Bounding box: xmin: 34031.82 ymin: 40392.88 xmax: 38881.06 ymax: 44812.07
Projected CRS: SVY21 / Singapore TM
amk_wdl <- st_read(dsn = "data/geospatial",
layer = "wdl_amk")Reading layer `wdl_amk' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 6855 features and 12 fields
Geometry type: LINESTRING
Dimension: XY
Bounding box: xmin: 26152.2 ymin: 37505 xmax: 31404.37 ymax: 42104.04
Projected CRS: SVY21 / Singapore TM
dl_pg <- st_read(dsn = "data/geospatial",
layer = "pg_dl")Reading layer `pg_dl' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 40 features and 12 fields
Geometry type: LINESTRING
Dimension: XY
Bounding box: xmin: 35253.61 ymin: 42595.38 xmax: 37130.03 ymax: 43050.74
Projected CRS: SVY21 / Singapore TM
dl_amk <- st_read(dsn = "data/geospatial",
layer = "dl_amk")Reading layer `dl_amk' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 13 features and 12 fields
Geometry type: LINESTRING
Dimension: XY
Bounding box: xmin: 28451.72 ymin: 38451.37 xmax: 30392.43 ymax: 39764.13
Projected CRS: SVY21 / Singapore TM




library(ggplot2)
#install.packages("ggmap")
library(ggmap)#dl_map2 <- osm_basemap +
# tm_shape(dl_class) +
# tm_lines(line_colors)
# tmap_options(check.and.fix = TRUE)
# View the map
#dl_map2target_buildings <- st_read(dsn = "data/geospatial",
layer = "target_buildings")Reading layer `target_buildings' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 9554 features and 7 fields (with 1 geometry empty)
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 26581.25 ymin: 33134.58 xmax: 44722.63 ymax: 44778.11
Projected CRS: SVY21 / Singapore TM
Coordinate Reference System:
User input: SVY21 / Singapore TM
wkt:
PROJCRS["SVY21 / Singapore TM",
BASEGEOGCRS["SVY21",
DATUM["SVY21",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4757]],
CONVERSION["Singapore Transverse Mercator",
METHOD["Transverse Mercator",
ID["EPSG",9807]],
PARAMETER["Latitude of natural origin",1.36666666666667,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8801]],
PARAMETER["Longitude of natural origin",103.833333333333,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8802]],
PARAMETER["Scale factor at natural origin",1,
SCALEUNIT["unity",1],
ID["EPSG",8805]],
PARAMETER["False easting",28001.642,
LENGTHUNIT["metre",1],
ID["EPSG",8806]],
PARAMETER["False northing",38744.572,
LENGTHUNIT["metre",1],
ID["EPSG",8807]]],
CS[Cartesian,2],
AXIS["northing (N)",north,
ORDER[1],
LENGTHUNIT["metre",1]],
AXIS["easting (E)",east,
ORDER[2],
LENGTHUNIT["metre",1]],
USAGE[
SCOPE["Cadastre, engineering survey, topographic mapping."],
AREA["Singapore - onshore and offshore."],
BBOX[1.13,103.59,1.47,104.07]],
ID["EPSG",3414]]
tb_cat <- target_buildings["Categorize"]
Reading layer `MPSZ-2019' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial\MPSZ'
using driver `ESRI Shapefile'
Simple feature collection with 332 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 103.6057 ymin: 1.158699 xmax: 104.0885 ymax: 1.470775
Geodetic CRS: WGS 84
Coordinate Reference System:
User input: WGS 84
wkt:
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["latitude",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["longitude",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4326]]
mpsz3414 <- st_transform(mpsz, 3414)Coordinate Reference System:
User input: EPSG:3414
wkt:
PROJCRS["SVY21 / Singapore TM",
BASEGEOGCRS["SVY21",
DATUM["SVY21",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4757]],
CONVERSION["Singapore Transverse Mercator",
METHOD["Transverse Mercator",
ID["EPSG",9807]],
PARAMETER["Latitude of natural origin",1.36666666666667,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8801]],
PARAMETER["Longitude of natural origin",103.833333333333,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8802]],
PARAMETER["Scale factor at natural origin",1,
SCALEUNIT["unity",1],
ID["EPSG",8805]],
PARAMETER["False easting",28001.642,
LENGTHUNIT["metre",1],
ID["EPSG",8806]],
PARAMETER["False northing",38744.572,
LENGTHUNIT["metre",1],
ID["EPSG",8807]]],
CS[Cartesian,2],
AXIS["northing (N)",north,
ORDER[1],
LENGTHUNIT["metre",1]],
AXIS["easting (E)",east,
ORDER[2],
LENGTHUNIT["metre",1]],
USAGE[
SCOPE["Cadastre, engineering survey, topographic mapping."],
AREA["Singapore - onshore and offshore."],
BBOX[1.13,103.59,1.47,104.07]],
ID["EPSG",3414]]



pa_mpsz <- mpsz3414["PLN_AREA_N"]mpsz2 <- as_Spatial(pa_mpsz)pg = mpsz2[mpsz2@data$PLN_AREA_N == "PUNGGOL",]
amk = mpsz2[mpsz2@data$PLN_AREA_N == "ANG MO KIO",]
pg_sp = as(pg, "SpatialPolygons")
amk_sp = as(amk, "SpatialPolygons")pg_owin = as(pg_sp, "owin")
amk_owin = as(amk_sp, "owin")edl_pg_points_sf <- st_as_sf(edl_pg_points)edl_coords <- st_coordinates(edl_pg_points_sf)
# Create an owin object from the coordinates
edl_pg_owin <- owin(xrange = range(edl_coords[,1]), yrange = range(edl_coords[,2]))edl_amk_points_sf <- st_as_sf(edl_amk_points)amk_edl_coords <- st_coordinates(edl_amk_points_sf)
# Create an owin object from the coordinates
edl_amk_owin <- owin(xrange = range(amk_edl_coords[,1]), yrange = range(amk_edl_coords[,2]))

edl_pg_ppp = edl_pg_ppp[pg_owin]
edl_a_ppp = edl_amk_ppp[amk_owin]




class(pg)[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
pg_sf <- st_as_sf(pg)
amk_sf <- st_as_sf(amk)pg_buildings <- st_intersection(pg_sf, tb_cat)
amk_buildings <- st_intersection(amk_sf, tb_cat)

library(ggplot2)
#install.packages("ggmap")
library(ggmap)landuse_pg <- st_read(dsn = "data/geospatial",
layer = "FYP_target_landuse_PG")Reading layer `FYP_target_landuse_PG' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 567 features and 22 fields
Geometry type: MULTIPOLYGON
Dimension: XY, XYZ
Bounding box: xmin: 31956.1 ymin: 40850.4 xmax: 38889.96 ymax: 44808.79
z_range: zmin: 0 zmax: 0
Projected CRS: SVY21 / Singapore TM
landuse_amk <- st_read(dsn = "data/geospatial",
layer = "FYP_target_landuse_AMK")Reading layer `FYP_target_landuse_AMK' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 5018 features and 22 fields
Geometry type: MULTIPOLYGON
Dimension: XY, XYZ
Bounding box: xmin: 26147.34 ymin: 37481.8 xmax: 31185.22 ymax: 42180.82
z_range: zmin: 0 zmax: 0
Projected CRS: SVY21 / Singapore TM
landuse_pg_desc <- (landuse_pg["descriptio"])plot(landuse_amk["descriptio"])
plot(landuse_pg_desc)
landuse_pg_sf <- st_as_sf(landuse_pg)
landuse_amk_sf <- st_as_sf(landuse_amk)landuse_pg_sf <- st_make_valid(landuse_pg_sf)
valid_pg <- st_make_valid(pg_sf)
valid_amk <- st_make_valid(amk_sf)pg_landuse <- st_intersection(valid_pg, landuse_pg_sf)
amk_landuse <- st_intersection(valid_amk, landuse_amk_sf)parks_pg <- st_read(dsn = "data/geospatial",
layer = "FYP_walkingtime_parks_PG")Reading layer `FYP_walkingtime_parks_PG' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 20 features and 3 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 34876.04 ymin: 41522.67 xmax: 37386.37 ymax: 43523.24
Projected CRS: SVY21 / Singapore TM
parks_amk <- st_read(dsn = "data/geospatial",
layer = "FYP_walkingtime_parks_AMK")Reading layer `FYP_walkingtime_parks_AMK' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 11 features and 3 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 27351.72 ymin: 39057.31 xmax: 30492.3 ymax: 41605.77
Projected CRS: SVY21 / Singapore TM
healthcare_pg <- st_read(dsn = "data/geospatial",
layer = "FYP_walkingtime_healthcare_PG")Reading layer `FYP_walkingtime_healthcare_PG' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 21 features and 3 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 34987.76 ymin: 41965.05 xmax: 38171.03 ymax: 44135
Projected CRS: SVY21 / Singapore TM
healthcare_amk <- st_read(dsn = "data/geospatial",
layer = "FYP_walkingtime_healthcare_AMK_1")Reading layer `FYP_walkingtime_healthcare_AMK_1' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 16 features and 2 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 27176.45 ymin: 38409.92 xmax: 31090.67 ymax: 39967.57
Projected CRS: SVY21 / Singapore TM
food_pg <- st_read(dsn = "data/geospatial",
layer = "FYP_walkingtime_foodplaces_PG")Reading layer `FYP_walkingtime_foodplaces_PG' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 12 features and 3 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 34861.09 ymin: 41878.28 xmax: 37764.21 ymax: 43760.28
Projected CRS: SVY21 / Singapore TM
food_amk <- st_read(dsn = "data/geospatial",
layer = "FYP_walkingtime_foodplaces_AMK")Reading layer `FYP_walkingtime_foodplaces_AMK' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 14 features and 3 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 28389.21 ymin: 38453.36 xmax: 30971.45 ymax: 40817.5
Projected CRS: SVY21 / Singapore TM
smarket_pg <- st_read(dsn = "data/geospatial",
layer = "FYP_walkingtime_smarket_PG")Reading layer `FYP_walkingtime_smarket_PG' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 16 features and 3 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 34958.94 ymin: 41808.02 xmax: 37583.44 ymax: 44161.24
Projected CRS: SVY21 / Singapore TM
smarket_amk <- st_read(dsn = "data/geospatial",
layer = "FYP_walkingtime_smarket_AMK")Reading layer `FYP_walkingtime_smarket_AMK' from data source
`C:\Users\Kachel Lee\ka33rina\FYP_New\Analysis\Geographic Analysis\data\geospatial'
using driver `ESRI Shapefile'
Simple feature collection with 12 features and 3 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 27166.86 ymin: 38567.79 xmax: 30312.63 ymax: 40817.5
Projected CRS: SVY21 / Singapore TM
plot(food_pg)
parks_pg_sf <- st_as_sf(parks_pg)
parks_amk_sf <- st_as_sf(parks_amk)
healthcare_pg_sf <- st_as_sf(healthcare_pg)
healthcare_amk_sf <- st_as_sf(healthcare_amk)
food_pg_sf <- st_as_sf(food_pg)
food_amk_sf <- st_as_sf(food_amk)
smarket_pg_sf <- st_as_sf(smarket_pg)
smarket_amk_sf <- st_as_sf(smarket_amk)parks_pg_sf <- st_make_valid(parks_pg_sf)
parks_amk_sf <- st_make_valid(parks_amk_sf)
healthcare_pg_sf <- st_make_valid(healthcare_pg_sf)
healthcare_amk_sf <- st_make_valid(healthcare_amk_sf)
food_pg_sf <- st_make_valid(food_pg_sf)
food_amk_sf <- st_make_valid(food_amk_sf)
smarket_pg_sf <- st_make_valid(smarket_pg_sf)
smarket_amk_sf <- st_make_valid(smarket_amk_sf)pg_parks <- st_intersection(valid_pg, parks_pg_sf)
pg_healthcare <- st_intersection(valid_pg, healthcare_pg_sf)
pg_food <- st_intersection(valid_pg, food_pg_sf)
pg_smarket <- st_intersection(valid_pg, smarket_pg_sf)
amk_parks <- st_intersection(valid_amk, parks_amk_sf)
amk_healthcare <- st_intersection(valid_amk, healthcare_amk_sf)
amk_food <- st_intersection(valid_amk, food_amk_sf)
amk_smarket <- st_intersection(valid_amk, smarket_amk_sf)Buildings Chart
These 2 maps visually represents the categorization of buildings based on color codes, providing insights into the distribution and diversity of building types within the area of interest.
Punggol Buildings Chart
pg_b_cat <- pg_buildings["Categorize"]
plot(pg_b_cat, key.width = 12.64)
Ang Mo Kio Buildings Chart
amk_b_cat <- amk_buildings["Categorize"]
plot(amk_b_cat, key.width = 12.64)
Buildings Chart on OSM Layer
These 2 maps overlays color-coded building categorization onto an OpenStreetMap (OSM) layer, enabling users to explore both the geographical distribution of buildings and their respective categories while retaining the ability to zoom in for detailed views and identification of individual building names.
Punggol Buildings Chart on OSM Layer
tmap_mode('view')
# Define basemaps
osm_basemap <- tm_basemap(server = "OpenStreetMap.HOT")
imagery_basemap <- tm_basemap(server = "Esri.WorldImagery")
# Plot pg_b_cat over OpenStreetMap basemap with color categorization and legend
pg_b_cat_map2 <- tm_shape(pg_b_cat) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "Categorize", title = "Building Category") + # Color categorization
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
pg_b_cat_map2Ang Mo Kio Buildings Chart on OSM Layer
# Plot pg_b_cat over OpenStreetMap basemap with color categorization and legend
amk_b_cat_map <- tm_shape(amk_b_cat) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "Categorize", title = "Building Category") + # Color categorization
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
amk_b_cat_mapWalkway Lines on OSM Layer
These 2 maps overlays the walkways onto an OpenStreetMap (OSM) layer, enabling users to explore both the designed walkways and their respective categories while retaining the ability to zoom in for detailed views.
Punggol Walkway Lines on OSM Layer
tmap_mode('view')
# Define basemaps
osm_basemap <- tm_basemap(server = "OpenStreetMap.HOT")
imagery_basemap <- tm_basemap(server = "Esri.WorldImagery")
# Plot dl_class over OpenStreetMap basemap
dl_map <- osm_basemap +
tm_shape(dl_class) +
tm_lines(col = "red", lwd = 2) + # Adjust line color and width as needed
tmap_options(check.and.fix = TRUE)
# View the map
dl_mapAng Mo Kio Walkway Lines on OSM Layer
a_dl_class <- amk_wdl["desired_li"]
tmap_mode('view')
# Define basemaps
osm_basemap <- tm_basemap(server = "OpenStreetMap.HOT")
imagery_basemap <- tm_basemap(server = "Esri.WorldImagery")
# Plot dl_class over OpenStreetMap basemap
dl_map <- osm_basemap +
tm_shape(a_dl_class) +
tm_lines(col = "red", lwd = 2) + # Adjust line color and width as needed
tmap_options(check.and.fix = TRUE)
# View the map
dl_mapDesired Lines vs Walkway Lines
These 2 maps aid in identifying potential problem areas within the estate by highlighting where desired lines intersect or deviate from the existing walkway network, facilitating targeted interventions or improvements.
Punggol Desired Lines vs Walkway Lines
# Define colors based on the value of the "fclass" column
line_colors <- ifelse(pg_wdl$fclass == "dl", "red", "green")
dl_class <- pg_wdl["desired_li"]
# Plot with custom colors
plot(dl_class, col = line_colors, main = "Desired Lines in Punggol")
Ang Mo Kio Desired Lines vs Walkway Lines
# Define colors based on the value of the "fclass" column
line_colors <- ifelse(amk_wdl$fclass == "dl", "red", "green")
a_dl_class <- amk_wdl["desired_li"]
# Plot with custom colors
plot(a_dl_class, col = line_colors, main = "Desired Lines in Ang Mo Kio")
Desired Lines on OSM Layer
These 2 maps pinpoints the locations of desired Lines within the urban landscape, shedding light on nearby facilities and potential factors influencing the emergence of these patterns.
Punggol Desired Lines on OSM Layer
tmap_mode('view')
# Define basemaps
osm_basemap <- tm_basemap(server = "OpenStreetMap.HOT")
imagery_basemap <- tm_basemap(server = "Esri.WorldImagery")
# Plot dl_class over OpenStreetMap basemap
dl_map <- osm_basemap +
tm_shape(dl_pg) +
tm_lines(col = "red", lwd = 2) + # Adjust line color and width as needed
tmap_options(check.and.fix = TRUE)
# View the map
dl_mapIn the map showcasing Punggol’s desired lines on an OSM Layer, a notable observation that the main concentration of desired lines occur mainly at the main road infrastructure. In addition, areas with a higher occurrence of desired lines are typically found below HDB blocks as shown in the map. Through our on-the-ground scouting, we’ve noted that many of these designated lines lead to playgrounds, exercise corners, or roundabouts.
This method of visual representation helped us to easily pinpoint and showcase the areas that have a heightened potential for desired line occurrences. This allows us to also direct more attention to these specific locations, enabling a more focused investigation into preventive measures aimed at mitigating the emergence of desired lines.
Ang Mo Kio Desired Lines on OSM Layer
tmap_mode('view')
# Define basemaps
osm_basemap <- tm_basemap(server = "OpenStreetMap.HOT")
imagery_basemap <- tm_basemap(server = "Esri.WorldImagery")
# Plot dl_class over OpenStreetMap basemap
dl_map_amk <- osm_basemap +
tm_shape(dl_amk) +
tm_lines(col = "red", lwd = 2) + # Adjust line color and width as needed
tmap_options(check.and.fix = TRUE)
# View the map
dl_map_amkCompared to the Punggol graph, the Ang Mo Kio graph depicts fewer and more dispersed desired lines. While the majority of desired lines are still situated along roads, their frequency is notably lower and more evenly distributed. Moreover, within the HDB estate itself, there is a noticeable absence of desired lines.
Kernel Density Estimation Graphs
Kernel Density Estimation (KDE) is a technique employed to quantify the intensity of a point distribution. Utilizing KDE, we aim to assess the intensity of the desired line distribution and examine its spatial distribution across the area of interest.
Punggol Kernel Density Estimation Graphs
# Set up a 2x2 layout with reduced margins
par(mfrow = c(2, 2), mar = c(2, 2, 2, 2))
# Chart 1
plot(density(edl_pg_ppp,
sigma = bw.CvL,
edge = TRUE,
kernel = "gaussian"),
main = "Punggol Desired Lines CvL")
# Chart 2
plot(density(edl_pg_ppp,
sigma = bw.scott,
edge = TRUE,
kernel = "gaussian"),
main = "Punggol Desired Lines scott")
# Chart 3
plot(density(edl_pg_ppp,
sigma = bw.diggle,
edge = TRUE,
kernel = "gaussian"),
main = "Punggol Desired Lines diggle")
# Chart 4
plot(density(edl_pg_ppp,
sigma = bw.ppl,
edge = TRUE,
kernel = "gaussian"),
main = "Punggol Desired Lines ppl")
Ang Mo Kio Kernel Density Estimation Graphs
# Set up a 2x2 layout with reduced margins
par(mfrow = c(2, 2), mar = c(2, 2, 2, 2))
# Chart 1
plot(density(edl_a_ppp,
sigma = bw.CvL,
edge = TRUE,
kernel = "gaussian"),
main = "Ang Mo Kio Desired Lines CvL")
# Chart 2
plot(density(edl_a_ppp,
sigma = bw.scott,
edge = TRUE,
kernel = "gaussian"),
main = "Ang Mo Kio Desired Lines scott")
# Chart 3
plot(density(edl_a_ppp,
sigma = bw.diggle,
edge = TRUE,
kernel = "gaussian"),
main = "Ang Mo Kio Desired Lines diggle")
# Chart 4
plot(density(edl_a_ppp,
sigma = bw.ppl,
edge = TRUE,
kernel = "gaussian"),
main = "Ang Mo Kio Desired Lines ppl")
Landuse on OSM Layer
These 2 maps offers an insightful overview of the land use patterns across the area, allowing for a comprehensive understanding of how different spaces are utilized within the our area of study.
Punggol Landuse on OSM Layer
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
pg_landuse_map <- tm_shape(pg_landuse) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "Categorize", title = "Landuse Category", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
pg_landuse_mapAng Mo Kio Landuse on OSM Layer
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
amk_landuse_map <- tm_shape(amk_landuse) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "Categorize", title = "Landuse Category", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
amk_landuse_mapFrom the land use map of Ang Mo Kio, a clear distinction emerges between residential areas, with private houses represented by small polygons, and public housing estates depicted as larger polygons. This straightforward visualization aids in comprehending the land use distribution within our study area, offering valuable insights into urban planning and development.
Isotope Areas on Key Amenities
Study on Punggol Area Key Amenities
Punggol Isotope Areas of Parks on OSM Layer (Key Amenities)
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
pg_parks_map <- tm_shape(pg_parks) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "cost_level", title = "Isotope Areas of Parks", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
pg_parks_mapPunggol Isotope Areas of Healthcare on OSM Layer (Key Amenities)
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
pg_healthcare_map <- tm_shape(pg_healthcare) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "cost_level", title = "Isotope Areas of Healthcare", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
pg_healthcare_mapPunggol Isotope Areas of Food Places on OSM Layer (Key Amenities)
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
pg_food_map <- tm_shape(pg_food) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "cost_level", title = "Isotope Areas of Food Places", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
pg_food_mapPunggol Isotope Areas of Supermarkets on OSM Layer (Key Amenities)
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
pg_smarket_map <- tm_shape(pg_smarket) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "cost_level", title = "Isotope Areas of Supermarkets", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
pg_smarket_mapHawker centres in Punggol are generally sparse in Punggol, and is especially the case for areas which are further away from shopping malls and transport hubs like bus interchanges or MRT stations, which makes it a problem for elderly people who wish to find food places that are near to their residences. This is further supported by the network analysis of Punggol and our subsequent on-the-ground research in selected subzones in Punggol.
However, other key amenities (i.e. polyclinics, supermarkets, and parks) are relatively more accessible, and there are sufficient supermarkets that cover residential areas within a 5 minute walking time. Elderly people who needs frequent healthcare checkups wouldn’t need to worry about a lack of polyclinics, as the walkways in the area facilitates more direct access to polyclinics.
Study on Ang Mo Kio Area Key Amenities
Ang Mo Kio Isotope Areas of Parks on OSM Layer (Key Amenities)
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
amk_parks_map <- tm_shape(amk_parks) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "cost_level", title = "Isotope Areas of Parks", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
amk_parks_mapAng Mo Kio Isotope Areas of Healthcare on OSM Layer (Key Amenities)
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
amk_healthcare_map <- tm_shape(amk_healthcare) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "cost_level", title = "Isotope Areas of Healthcare", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
amk_healthcare_mapAng Mo Kio Isotope Areas of Supermarkets on OSM Layer (Key Amenities)
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
amk_smarket_map <- tm_shape(amk_smarket) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "cost_level", title = "Isotope Areas of Supermarkets", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
amk_smarket_mapAng Mo Kio Isotope Areas of Food Places on OSM Layer (Key Amenities)
# Plot pg_landuse over OpenStreetMap basemap with color categorization, legend, and lower opacity
amk_food_map <- tm_shape(amk_food) +
tm_borders() + # Plot borders of the polygons
tm_fill(col = "cost_level", title = "Isotope Areas of Food Places", alpha = 0.5) + # Color categorization with lower opacity
tm_layout(legend.show = TRUE) + # Show legend
osm_basemap # Add basemap
# View the map
amk_food_mapThe purpose of conducting this network analysis on Ang Mo Kio is to analyze the accessibility of key amenities for residents staying in the estate. We asked the question: for each key amenity, how many residential buildings are within 10 minutes walking time, and what proportion of those residential blocks are within a walking time of 5 minutes? Network analysis on were conducted on these key amenities:
Food places (i.e. hawker centres)
Healthcare facilities (i.e. polyclinics)
Parks
Supermarkets (e.g. NTUC Fairprice, Sheng Siong, etc)
These 4 categories of amenities are prioritized for URA’s Land Use planning. Therefore, we utilized OpenStreetMap data to retrieve GIS road layers (i.e. walkable paths in Singapore), locations of key amenities, & locations of residential buildings to conduct this analysis. We then utilized the Iso-Area as Polygon algorithm from the QGIS Network Analysis Toolbox 3 (QNEAT3) library to generate the polygons. The critical parameters for the algorithm were set as follows:
Selecting the paths that are walkable in the Vector layer representing network
Start Points: For each category of key amenities, select 1 at random, which will be the start point of the polygon
Size of Iso-Area: Time-based. For this project, we are study walking times of up to 10 minutes, which is equal to 600 seconds.
Contour Interval: Time-based. For the purpose of our analysis, we are using time intervals of 2.5 mins, which is equal to 150 seconds.
Path type to calculate: Fastest Path (time optimization).
Setting the Default Speed as 4.44km/h, which is the average walking speed of Singaporeans.
The rest of the parameters are left as their default values.
For each category of amenities, we ran the algorithm for a total of 5 times, with the amenities chosen at random as start points for each iteration of the algorithm. This was done to investigate the accessibility of hawker centres in general and to ensure consistency in our network analysis. To further ensure consistency, each hawker centre were chosen as far apart from each other as possible, without any prior knowledge of its surrounding buildings, where is it situated, and its proximity to other residential buildings.
From the network analysis, hawker centres in Ang Mo Kio cover a sufficient amount of residential buildings within a 5 minutes walking time. In our first example, this can be seen by the total number of residential buildings that are within the 2 innermost polygons, which is a total of 13 residential buildings. Repeated iterations of the algorithm showed similar results, which implied that most residents living in Ang Mo Kio will have little trouble finding eateries in their neighborhood. However, it is likely that the walking speed of most elderly people is slower than the average of 4.44km/h, which means that there are lesser residential areas that can be covered by food centres within a 5 minutes walking time. When considering Ang Mo Kio is geographically hilly in nature and has an aging population, it exacerbates the problem for the elderly in the area. Similar results can also be seen with supermarkets, parks, and polyclinics in Ang Mo Kio.